home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 2
/
Nebula Two.iso
/
SourceCode
/
Inspectors
/
SwapView_2.0r
/
SwapView.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
4KB
|
193 lines
/*
* Author: Greg Burd, Mr. Average Developer
* (I would like to be a member of the NeXT Developer Support Team.)
*
* You may freely copy, distribute and reuse the code in this example.
* I disclaim any warranty of any kind, expressed or implied, as to
* its fitness for any particular use.
*/
#import "SwapView.h"
#import <appkit/Window.h>
#import <appkit/Application.h>
#import <dpsclient/psops.h>
#import <dpsclient/wraps.h>
#import <dpsclient/dpsNeXT.h>
#import <appkit/graphics.h>
#import <objc/List.h>
/**************************************************************/
/*
* Author: Greg Burd, Mr. Average Developer
* (I would like to be a member of the NeXT Developer Support Team.)
*
* You may freely copy, distribute and reuse the code in this example.
* I disclaim any warranty of any kind, expressed or implied, as to
* its fitness for any particular use.
*
*
* This contains a function that really needs to be in the
* NX functions, so I named it as such. It should be used when
* coding delegate functions.
*
* NXAskDelegate(id delegate, SEL delegateMethod);
*
* Simply put it makes sure that that the delegate object is not
* nil and that it respondsTo: the selector delegateMethod. If it
* does it calls the delegate with the selector and returns the result
* otherwise it returns NULL.
*/
#import <objc/objc.h>
extern void* NXAskDelegate(id delegate, SEL selector)
{
return (delegate && [delegate respondsTo:selector]);
}
/**************************************************************/
@implementation SwapView
- init
{
NXRect theFrame = {{0.0, 0.0}, {0.0, 0.0}};
return [self initFrame:&theFrame];
}
/* designated initilizer */
- initFrame:(NXRect *)theFrame
{
[super initFrame:theFrame];
lastInspector = NULL;
currentInspector = NULL;
backgroundGray = NX_LTGRAY;
return self;
}
- currentInspector
{
return currentInspector;
}
- lastInspector
{
return lastInspector;
}
- delegate
{
return delegate;
}
- setDelegate:(id)anObject
{
delegate = anObject;
return self;
}
- (float)backgroundGray
{ return backgroundGray; }
- setBackgroundGray:(float)aGray
{
backgroundGray = aGray;
return self;
}
/* WARNING!!!!
*
* Don't forget to make sure that the off screen windows are NOT deferred!!!
* This means make sure that you turn the Deffered switch OFF in IB when
* looking at the Atributes inspector. This allows offscreen drawing. If it
* was on, then the gstate will be zero!!!!
*/
- swapIt:sender
{ [self swapIt]; return self; }
/* this is the real function !! */
- swapIt
{
NXRect theFrame;
int gstate;
id aView, inspector;
/* make sure the delegate impliments the whatPanel call */
if (!NXAskDelegate(delegate, @selector(whatPanel))){
//logError somewhere
};
// call the delegate
inspector = [delegate whatPanel];
/* make sure that it is a new view to swap in */
if(lastInspector != inspector) {
if(lastInspector) {
/* remove old inspector from view hierarchy */
aView = [lastInspector contentView];
[aView removeFromSuperview];
/* and put it back */
[lastInspector setContentView:aView];
}
/* update the offscreen view */
[inspector display];
NXPing();
/* no inspector so clean up the background */
if(!inspector){
[self lockFocus];
/* use the backgroundGray */
PSsetgray(backgroundGray);
NXRectFill(&bounds);
[self unlockFocus];
/* now the last inspector is NULL */
lastInspector = NULL;
/* let the window server cetch up... (yawn...) */
NXPing();
}
/* put in the new inspector */
gstate = [inspector gState];
if (gstate) {
/* get the frame to composite in */
[[inspector contentView] getFrame:&theFrame];
[self lockFocus];
/* blast the bits over to the view we locked focus on (ie. SwapView) */
PScomposite((float)theFrame.origin.x,
(float)theFrame.origin.y,
(float)theFrame.size.width,
(float)theFrame.size.height,
(int)gstate,
(float)1.0,
(float)1.0,
(int)NX_COPY);
[self unlockFocus];
/* now add the subview to the SwapView for the responder chain... */
[self addSubview:[inspector contentView]];
/* and remember the panel it came from */
lastInspector = inspector;
}
/* see whats up out there */
[[self window] flushWindow];
}
return self;
}
- free
{
return [super free];
}
@end